package com.wuxinwudai.android.widget;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.wuxinwudai.android.database.MarkDataBean;

import java.util.ArrayList;
import java.util.Collection;

/**
 * ExBaseAdapter 类为 ListView 的 BaseAdapter 的功能扩展类
 * @author 吾心无待 于 2016年04月10日
 * @param <T> 数据类型
 * @param <VH> ViewHolder 类型
 */
public abstract class  ExBaseAdapter<T extends MarkDataBean,VH extends ExBaseAdapter.ViewHolder> extends BaseAdapter {
    protected ArrayList<T> mList;//数据列表
    protected Context mContext;//上下文对象
    protected LayoutInflater mLayoutInflater;// LayoutInflater

    /**
     * 构造函数，供子类调用
     * @param context  上下文对象
     * @param list 数据列表
     */
    protected ExBaseAdapter(Context context,ArrayList<T> list){
        super();
        this.mContext = context;
        mList = list == null ? new ArrayList<T>() : list;
        mLayoutInflater = LayoutInflater.from(mContext);
    }
    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        VH vh;
        if (convertView != null){
            vh = (VH)convertView.getTag();
        }else {
            convertView = mLayoutInflater.inflate(getListViewItemLayoutResID(),parent,false);
            vh = getViewHolder(convertView);
            convertView.setTag(vh);
        }
        T t = mList.get(position);
        initViewHolder(vh,t);
        return convertView;
    }

    /**
     * 使用获得的数据项初始化 ViewHolder 的子视图
     * @param vh VIewHolder 对象
     * @param t 数据项
     */
    public abstract void initViewHolder(VH vh,T t);

    /**
     * 获取列表项布局资源 id
     * @return 列表项布局资源 id
     */
    public abstract int getListViewItemLayoutResID();

    /**
     * 获取 ViewHolder
     * @param convertView 列表项视图
     * @return ViewHolder 对象
     */
    public abstract VH getViewHolder(View convertView);

    /**
     * 添加一条数据记录
     * @param t 数据
     */
    public void add(T t){
        this.mList.add(t);
    }

    /**
     * 添加多条数据记录
     * @param list 数据记录列表
     */
    public void addAll(Collection<T> list){
        this.mList.addAll(list);
    }

    /**
     * 移除指定索引数据
     * @param index 数据项索引
     */
    public void remove(int index){
        this.mList.remove(mList.remove(index));
    }

    /**
     * 移除指定数据项
     * @param t 移除指定数据项
     */
    public void remove(T t){ this.mList.remove(t);}

    /**
     * 更新指定索引项
     * @param index 索引位置
     * @param t 新数据项
     */
    public void update(int index,T t){
        this.mList.set(index,t);
    }

    /**
     * 获取数据源
     * @return 数据源
     */
    public ArrayList<T> getList() {
        return mList;
    }

    /**
     * 重新设置数据
     * @param data 数据
     */
    public void reset(ArrayList<T> data){
        mList = data;
        notifyDataSetChanged();
    }

    /**
     * ViewHolder 接口标志 ViewHolder 以用于ExBaseAdapter
     * @author 吾心无待 于2016年06月04日
     */
    public interface ViewHolder {
    }

}
